package lu.med.praxiswahl.wahlumed.client.kalender;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import lu.med.praxiswahl.wahlumed.client.utilities.UniCode;
import lu.med.praxiswahl.wahlumed.client.wclient.Main;

/**
 * 
 * @author Lars Holger Roth
 */
public class FromToDialog extends JDialog implements ActionListener {

	/**
     * 
     */
	private static final long serialVersionUID = -1858037634416244296L;
	public static final int MODE_URLAUB = 0;
	public static final int MODE_FEIERTAG = 1;
	public static final int MODE_DELETE = 2;
	private Main dataManager;
	private int mode;
	private JTextField vonJahr, vonMonat, vonTag;
	private JTextField bisJahr, bisMonat, bisTag;

	public FromToDialog(Main owner, Main dataManager, int mode) {
		super(owner, true);
		if (mode == MODE_URLAUB) {
			this.setTitle("Urlaubstage markieren");
		} else if (mode == MODE_FEIERTAG) {
			this.setTitle("Feiertage markieren");
		} else
			this.setTitle("Markierung l" + UniCode.getoe() + "schen");
		this.dataManager = dataManager;
		this.mode = mode;
		JPanel optionPanel = new JPanel(new GridLayout(2, 0));
		JPanel von, bis;
		vonJahr = new JTextField("");
		vonMonat = new JTextField("");
		vonTag = new JTextField("");
		bisJahr = new JTextField("");
		bisMonat = new JTextField("");
		bisTag = new JTextField("");
		von = new JPanel(new GridLayout(0, 6));
		von.setBorder(BorderFactory.createTitledBorder("Von"));
		von.add(new JLabel("Tag"));
		von.add(vonTag);
		von.add(new JLabel("Monat"));
		von.add(vonMonat);
		von.add(new JLabel("Jahr"));
		von.add(vonJahr);

		bis = new JPanel(new GridLayout(0, 6));
		bis.setBorder(BorderFactory.createTitledBorder("Bis"));
		bis.add(new JLabel("Tag"));
		bis.add(bisTag);
		bis.add(new JLabel("Monat"));
		bis.add(bisMonat);
		bis.add(new JLabel("Jahr"));
		bis.add(bisJahr);

		optionPanel.add(von);
		optionPanel.add(bis);

		JPanel buttonPanel = new JPanel();
		JButton b1, b2;
		b1 = new JButton("Ok");
		b2 = new JButton("Abbrechen");
		b1.addActionListener(this);
		b2.addActionListener(this);
		buttonPanel.add(b1);
		buttonPanel.add(b2);

		this.add(optionPanel, BorderLayout.CENTER);
		this.add(buttonPanel, BorderLayout.SOUTH);

		this.pack();
		this.setVisible(true);
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equals("Abbrechen")) {
			this.setVisible(false);
		}
		if (e.getActionCommand().equals("Ok")) {
			// Übernimmt die Änderungen auf den Server
			if (vonJahr.getText().equals("")) {
				JOptionPane.showMessageDialog(dataManager,
						"Sie m" + UniCode.getue() + "ssen ein Jahr eingeben.");
				return;
			}
			if (vonMonat.getText().equals("")) {
				JOptionPane.showMessageDialog(dataManager,
						"Sie m" + UniCode.getue()
								+ "ssen einen Monat eingeben.");
				return;
			}
			if (vonTag.getText().equals("")) {
				JOptionPane.showMessageDialog(dataManager,
						"Sie m" + UniCode.getue() + "ssen einen Tag eingeben.");
				return;
			}
			if (bisJahr.getText().equals("")) {
				JOptionPane.showMessageDialog(dataManager,
						"Sie m" + UniCode.getue() + "ssen ein Jahr eingeben.");
				return;
			}
			if (bisMonat.getText().equals("")) {
				JOptionPane.showMessageDialog(dataManager,
						"Sie m" + UniCode.getue()
								+ "ssen einen Monat eingeben.");
				return;
			}
			if (bisTag.getText().equals("")) {
				JOptionPane.showMessageDialog(dataManager,
						"Sie m" + UniCode.getue() + "ssen einen Tag eingeben.");
				return;
			}

			Calendar vonC, bisC;
			vonC = new GregorianCalendar();
			vonC.set(Calendar.YEAR, Integer.parseInt(vonJahr.getText()));
			vonC.set(Calendar.MONTH, (Integer.parseInt(vonMonat.getText()) - 1));
			vonC.set(Calendar.DAY_OF_MONTH, Integer.parseInt(vonTag.getText()));
			bisC = new GregorianCalendar();
			bisC.set(Calendar.YEAR, Integer.parseInt(bisJahr.getText()));
			bisC.set(Calendar.MONTH, (Integer.parseInt(bisMonat.getText()) - 1));
			bisC.set(Calendar.DAY_OF_MONTH, Integer.parseInt(bisTag.getText()));

			boolean exit = false;

			while (!exit) {
				// Prüft Übereinstimmung von von und bis
				if (vonC.get(Calendar.YEAR) == bisC.get(Calendar.YEAR)) {
					if (vonC.get(Calendar.MONTH) == bisC.get(Calendar.MONTH)) {
						if (vonC.get(Calendar.DAY_OF_MONTH) == bisC
								.get(Calendar.DAY_OF_MONTH)) {
							exit = true;
						}
					}
				}
				if ((dataManager.isFeiertag(vonC))
						|| (dataManager.isUrlaub(vonC))) {
					// Revidiert nur den bestehenden Eintrag
					if (this.mode == MODE_URLAUB) {
						// Makiert das aktuelle Datum als Urlaub
						dataManager.setUrlaub(vonC);
					} else if (this.mode == MODE_FEIERTAG) {
						dataManager.setFeiertag(vonC);
					} else if (this.mode == MODE_DELETE) {
						dataManager.deleteMarkierung(vonC);
					}
				} else {
					// Erstellt den Eintrag neu
					if (this.mode == MODE_URLAUB) {
						// erstellt neuen Urlaubstag
						dataManager.getKalenderMarkierungenContext()
								.create_holliday(vonC, false, true);
					} else if (this.mode == MODE_FEIERTAG) {
						dataManager.getKalenderMarkierungenContext()
								.create_holliday(vonC, true, false);
					} else if (this.mode == MODE_DELETE) {
						// Eintrag existiert nicht, es muss daher auch
						// nichts gelöscht werden
					}
				}

				// Erhöht den Von Tag
				vonC.add(Calendar.DAY_OF_YEAR, 1);
			}
			// Liest die aktuelle Holliday Liste
			dataManager.refreshKalenderMarkierungen();
			this.setVisible(false);
		}
	}
}
